﻿using System;
using System.Linq.Expressions;

namespace Cesave.Domain.Core.Specification
{
    /// <summary>
    /// Una especificación directa es una simple implementación
    /// de una especificación que se satisface por medio de una
    /// expresión lambda en su constructor.
    /// </summary>
    /// <typeparam name="TEntity">Tipo de la entidad que checa ésta especificación.</typeparam>
    public class DirectSpecification<TEntity>
        : Specification<TEntity>
        where TEntity : class,new()
    {
        #region Members

        Expression<Func<TEntity, bool>> _MatchingCriteria;

        #endregion

        #region Constructor

        /// <summary>
        /// Constructor por defecto para ésta especificación.
        /// </summary>
        /// <param name="matchingCriteria">Criterio de igualación.</param>
        public DirectSpecification(Expression<Func<TEntity, bool>> matchingCriteria)
        {
            if (matchingCriteria == (Expression<Func<TEntity, bool>>)null)
                throw new ArgumentNullException("matchingCriteria");

            _MatchingCriteria = matchingCriteria;
        }

        #endregion

        #region Override

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public override Expression<Func<TEntity, bool>> SatisfiedBy()
        {
            return _MatchingCriteria;
        }

        #endregion
    }
}